package com.ssm.model;

import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import com.ssm.exception.WebException;
import com.ssm.model.mapper.BaseMapper;

/**
 * SSM 数据库Model操作类
 * @author 危文涛<245108903@qq.com>
 * @version 2016年1月30日 下午7:08:33
 *
 * @param <T> Mapper 
 */
@Component
public class Model {
	
	@Autowired
	private SqlSessionFactoryBean sqlSessionFactory;
	
	/**
	 * 获取mapper实例(自动提交)
	 * @author 危文涛<245108903@qq.com>
	 * @version 2016年1月30日 下午7:17:43
	 *
	 * @param type mapper类
	 * @return mapper实例
	 */
	public <ST extends BaseMapper> ST getMapper(Class<ST> type)
	{
	
		try {
			SqlSession session=sqlSessionFactory.getObject().openSession(true);
			return session.getMapper(type);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			new WebException("数据库工厂获取对象失败");
		}
		return null;
	}
	
	/**
	 * 获取一个新的数据库对话
	 * @author 危文涛<245108903@qq.com>
	 * @version 2016年1月30日 下午7:19:21
	 *
	 * @return sqlsession
	 */
	public SqlSession getSession()
	{
		try {
			return sqlSessionFactory.getObject().openSession();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			new WebException("数据库工厂获取对象失败");
		}
		return null;
	}
	
	
	public <MT> SSMTransaction getMapper(Class<MT>mappertype ,boolean isAutoCommit)
	{
		try {
			return new SSMTransaction(mappertype,sqlSessionFactory.getObject().openSession(isAutoCommit));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			new WebException("数据库工厂获取对象失败");
		}
		return null;
	}
	
	
	
	
}
